home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / perl5 / Mail / Field.pm < prev    next >
Text File  |  2008-07-29  |  5KB  |  218 lines

  1. # Copyrights 1995-2008 by Mark Overmeer <perl@overmeer.net>.
  2. #  For other contributors see ChangeLog.
  3. # See the manual pages for details on the licensing terms.
  4. # Pod stripped from pm file by OODoc 1.05.
  5. package Mail::Field;
  6. use vars '$VERSION';
  7. $VERSION = '2.04';
  8.  
  9.  
  10. use Carp;
  11. use strict;
  12. use Mail::Field::Generic;
  13.  
  14.  
  15. sub _header_pkg_name
  16. {   my $header = lc shift;
  17.     $header    =~ s/((\b|_)\w)/\U$1/g;
  18.  
  19.     if(length($header) > 8)
  20.     {   my @header = split /[-_]+/, $header;
  21.         my $chars  = int((7 + @header) / @header) || 1;
  22.         $header    = substr join('', map {substr $_,0,$chars} @header), 0, 8;
  23.     }
  24.     else
  25.     {   $header =~ s/[-_]+//g;
  26.     }
  27.  
  28.     'Mail::Field::' . $header;
  29. }
  30.  
  31. sub _require_dir
  32. {   my($class,$dir,$dir_sep) = @_;
  33.  
  34.     local *DIR;
  35.     opendir DIR, $dir
  36.         or return;
  37.  
  38.     my @inc;
  39.     foreach my $f (readdir DIR)
  40.     {   $f =~ /^([\w\-]+)/ or next;
  41.         my $p = $1;
  42.         my $n = "$dir$dir_sep$p";
  43.  
  44.         if(-d $n )
  45.         {   _require_dir("${class}::$f", $n, $dir_sep);
  46.         }
  47.         else
  48.         {   $p =~ s/-/_/go;
  49.             eval "require ${class}::$p";
  50.         }
  51.     }
  52.     closedir DIR;
  53. }
  54.  
  55. sub import
  56. {   my $class = shift;
  57.  
  58.     if(@_)
  59.     {   local $_;
  60.         eval "require " . _header_pkg_name($_) || die $@
  61.             for @_;
  62.         return;
  63.     }
  64.  
  65.     my($dir,$dir_sep);
  66.     foreach my $f (keys %INC)
  67.     {   next if $f !~ /^Mail(\W)Field\W/i;
  68.         $dir_sep = $1;
  69.         $dir = ($INC{$f} =~ /(.*Mail\W+Field)/i)[0] . $dir_sep;
  70.         last;
  71.     }
  72.  
  73.     _require_dir('Mail::Field', $dir, $dir_sep);
  74. }
  75.  
  76. # register a header class, this creates a new method in Mail::Field
  77. # which will call new on that class
  78. sub register
  79. {   my $thing  = shift;
  80.     my $method = lc shift;
  81.     my $class  = shift || ref($thing) || $thing;
  82.  
  83.     $method    =~ tr/-/_/;
  84.     $class     = _header_pkg_name $method
  85.     if $class eq "Mail::Field";
  86.  
  87.     croak "Re-register of $method"
  88.     if Mail::Field->can($method);
  89.  
  90.     no strict 'refs';
  91.     *{$method} = sub {
  92.     shift;
  93.     $class->can('stringify') or eval "require $class" or die $@;
  94.     $class->_build(@_);
  95.     };
  96. }
  97.  
  98. # the *real* constructor
  99. # if called with one argument then the `parse' method will be called
  100. # otherwise the `create' method is called
  101.  
  102. sub _build
  103. {   my $self = bless {}, shift;
  104.     @_==1 ? $self->parse(@_) : $self->create(@_);
  105. }
  106.  
  107.  
  108. sub new
  109. {   my $class = shift;
  110.     my $field = lc shift;
  111.     $field =~ tr/-/_/;
  112.     $class->$field(@_);
  113. }
  114.  
  115.  
  116. sub combine {confess "Combine not implemented" }
  117.  
  118. our $AUTOLOAD;
  119. sub AUTOLOAD
  120. {   my $method = $AUTOLOAD;
  121.     $method    =~ s/.*:://;
  122.  
  123.     $method    =~ /^[^A-Z\x00-\x1f\x80-\xff :]+$/
  124.         or croak "Undefined subroutine &$AUTOLOAD called";
  125.  
  126.     my $class = _header_pkg_name $method;
  127.  
  128.     unless(eval "require $class")
  129.     {   my $tag = $method;
  130.         $tag    =~ s/_/-/g;
  131.         $tag    = join '-',
  132.             map { /^[b-df-hj-np-tv-z]+$|^MIME$/i ? uc($_) : ucfirst(lc $_) }
  133.                 split /\-/, $tag;
  134.  
  135.         no strict;
  136.         @{"${class}::ISA"} = qw(Mail::Field::Generic);
  137.         *{"${class}::tag"} = sub { $tag };
  138.     }
  139.  
  140.     Mail::Field->can($method)
  141.         or $class->register($method);
  142.  
  143.     goto &$AUTOLOAD;
  144. }
  145.  
  146.  
  147. # Of course, the functionality should have been in the Mail::Header class
  148. sub extract
  149. {   my ($class, $tag, $head) = (shift, shift, shift);
  150.  
  151.     my $method = lc $tag;
  152.     $method    =~ tr/-/_/;
  153.  
  154.     if(@_==0 && wantarray)
  155.     {   my @ret;
  156.         my $text;  # need real copy!
  157.         foreach $text ($head->get($tag))
  158.         {   chomp $text;
  159.             push @ret, $class->$method($text);
  160.         }
  161.         return @ret;
  162.     }
  163.  
  164.     my $idx  = shift || 0;
  165.     my $text = $head->get($tag,$idx)
  166.         or return undef;
  167.  
  168.     chomp $text;
  169.     $class->$method($text);
  170. }
  171.  
  172.  
  173. # before 2.00, this method could be called as class method, however
  174. # not all extensions supported that.
  175. sub create
  176. {   my ($self, %arg) = @_;
  177.     %$self = ();
  178.     $self->set(\%arg);
  179. }
  180.  
  181.  
  182. # before 2.00, this method could be called as class method, however
  183. # not all extensions supported that.
  184. sub parse
  185. {   my $class = ref shift;
  186.     confess "parse() not implemented";
  187. }
  188.  
  189.  
  190. sub stringify { confess "stringify() not implemented" } 
  191.  
  192.  
  193. sub tag
  194. {   my $thing = shift;
  195.     my $tag   = ref($thing) || $thing;
  196.     $tag =~ s/.*:://;
  197.     $tag =~ s/_/-/g;
  198.  
  199.     join '-',
  200.         map { /^[b-df-hj-np-tv-z]+$|^MIME$/i ? uc($_) : ucfirst(lc $_) }
  201.             split /\-/, $tag;
  202. }
  203.  
  204.  
  205. sub set(@) { confess "set() not implemented" }
  206.  
  207. # prevent the calling of AUTOLOAD for DESTROY :-)
  208. sub DESTROY {}
  209.  
  210.  
  211. sub text
  212. {   my $self = shift;
  213.     @_ ? $self->parse(@_) : $self->stringify;
  214. }
  215.  
  216.  
  217. 1;
  218.